#ifndef __TIN_H__
#define __TIN_H__
#include "TIN.h"
#include "../lib/LDoble.h"
#include "../lib/Lsimple.h"

typedef enum { TIN_BUG, TIN_IMPRO, TIN_TASK, TIN_NEWFUNC} tipo_inci_t;
typedef enum { TIN_FIXED, TIN_DONT_FIX, TIN_INCOMPLETE} resol_inci_t;
typedef enum { TIN_OPEN, TIN_PROGRESS, TIN_RESOLVED, TIN_REOPEN,TIN_CLOSED} stat_inci_t;
typedef enum { TIN_BLOCKING, TIN_CRITICAL, TIN_MAJOR, TIN_MINOR,TIN_TRIVIAL} prior_inci_t;


typedef struct {
	char* comm_date; /*fecha del comentario*/
	int comm_user_id; /*ID del usuario que realiza el comentario*/
	char* comm_desc; /*Comentario*/
} inci_comment_t;

typedef struct{
	char* stat_date; /*Fecha en la que se cambio el estado*/
	int stat_user_id; /*ID del usuario que camboi el estado*/
	stat_inci_t stat_desc; /*Estado*/
}inci_status_t;

typedef struct {
	int inci_id; /* ID de la incidencia */
	tipo_inci_t inci_type; /* Tipo de incidencia*/
	prior_inci_t inci_priority; /* Prioridad de la incidencia*/
	int inci_user; /* ID del usuario que creo la incidencia*/
	int inci_assigned_user; /* ID del usuario al que se le asigno */
	char* inci_date_created;
	int inci_project_id;
	char* inci_summary;
	char* inci_description;
	resol_inci_t inci_resolved;
	char* inci_date_solved;
	TListaSimple inci_stat_hist; /* historial de estados */
	TListaSimple inci_comm; /* comentarios de la incidencia */
} TIN;
typedef int tFecha;


/*PRE: tin tiene suficiente memoria reservada para una estructura de tipo TIN.
 *POST Si pudo crear la incidencia devuelve 0. Si hubo algún error devuelve -1.
 */
int TIN_Crear ( TIN* tin, int inci_id, tipo_inci_t inci_type, prior_inci_t inci_priority, int
inci_user, int inci_assigned_user, char* inci_date_created, int inci_project_id, char*
inci_summary, char* inci_description);


/*PRE tin creado.
 *POST Si devuelve 0, estructuras de control eliminadas y tin eliminada. Si devuelve
 *-1 ocurrió algún error.
 */
int TIN_Liberar( TIN* tin);


/*PRE tin creado.
 *POST Si devuelve 0, estado actualizado. Si devuelve
 *-1 ocurrió algún error.
 */
int TIN_CambiarEstado( TIN* tin, const char* fecha, const int usuario, const char* estado);


/*PRE tin creado.
 *POST Si devuelve 0, incidencia resuelta. Si devuelve
 *-1 ocurrió algún error.
 */
int TIN_Resolver( TIN* tin, const char* fecha, int usuario, resol_inci_t resolucion);


/*PRE: tin abierto.
 *POST: Comentario registrado. Devuelve -1 si ocurrió algún error.
 */
 int TIN_Comentar(TIN* tin, const char* fecha, int usuario, char* comentario);



/*PRE:
 *POST: Si pudo obtener los datos devuelve 0. Si hubo algún error devuelve -1.
 */
int TIN_GetDatos ( TIN* tin, int* inci_id, tipo_inci_t* inci_type, prior_inci_t*
inci_priority, int* inci_user, int* inci_assigned_user, char** inci_date_created,
int*inci_project_id, char** inci_summary, char** inci_description);


/*PRE: tin abierto. Comentarios apunta a una lista simple creada y vacía para
 *contener objetos de tipo inci_comment_t
 *POST: Si devuelve 0 devolvió en comentarios una lista de objetos
 *inci_comment_t con los datos de cada uno de los comentarios de la
 *incidencia. La memoria reservada para los strings debe ser liberada por el
 *invocador. Si devuelve -1 ocurrió un error y la lista permanece inalterada.
 */
int TIN_GetListaComentarios( const TIN* tin, TListaSimple* comentarios);


/*PRE: tin abierto. Estados apunta a una lista simple creada y vacía para
 *contener objetos de tipo inci_status_t.
 *POST: Si devuelve 0 devolvió en estados una lista de objetos inci_status_t
 *con los datos de cada uno de los estados de la incidencia. La memoria
 *reservada para los strings debe ser liberada por el invocador. Si devuelve -1
 *ocurrió un error y la lista permanece inalterada.
 */
int TIN_GetListaEstados( const TIN* tin, TListaSimple* estados);

#endif /*__TIN_H__ */


